#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

int typeCounts[46][4] = {
{	9	,	0	,	0	,	0	},
{	9	,	1	,	0	,	0	},
{	9	,	2	,	0	,	0	},
{	9	,	2	,	1	,	2	},
{	9	,	3	,	0	,	0	},
{	9	,	3	,	1	,	2	},
{	9	,	3	,	1	,	3	},
{	9	,	4	,	0	,	0	},
{	9	,	4	,	1	,	2	},
{	9	,	4	,	1	,	3	},
{	9	,	4	,	1	,	4	},
{	9	,	4	,	2	,	2	},
{	8	,	0	,	0	,	0	},
{	8	,	1	,	0	,	0	},
{	8	,	2	,	0	,	0	},
{	8	,	2	,	1	,	2	},
{	8	,	3	,	0	,	0	},
{	8	,	3	,	1	,	2	},
{	8	,	3	,	1	,	3	},
{	8	,	4	,	0	,	0	},
{	8	,	4	,	1	,	2	},
{	8	,	4	,	1	,	3	},
{	8	,	4	,	1	,	4	},
{	8	,	4	,	2	,	2	},
{	7	,	0	,	0	,	0	},
{	7	,	1	,	0	,	0	},
{	7	,	2	,	0	,	0	},
{	7	,	2	,	1	,	2	},
{	7	,	3	,	0	,	0	},
{	7	,	3	,	1	,	2	},
{	7	,	3	,	1	,	3	},
{	6	,	0	,	0	,	0	},
{	6	,	1	,	0	,	0	},
{	6	,	2	,	0	,	0	},
{	6	,	2	,	1	,	2	},
{	6	,	3	,	0	,	0	},
{	6	,	3	,	1	,	2	},
{	6	,	3	,	1	,	3	},
{	5	,	0	,	0	,	0	},
{	5	,	1	,	0	,	0	},
{	5	,	2	,	0	,	0	},
{	5	,	2	,	1	,	2	},
{	4	,	0	,	0	,	0	},
{	4	,	1	,	0	,	0	},
{	4	,	2	,	0	,	0	},
{	4	,	2	,	1	,	2	},
};

int targetOrder[46] = {
12	,
11	,
10	,
8	,
9	,
7	,
6	,
5	,
4	,
3	,
1	,
2	,
24	,
23	,
22	,
20	,
21	,
19	,
18	,
17	,
16	,
15	,
13	,
14	,
31	,
30	,
29	,
28	,
27	,
26	,
25	,
38	,
37	,
36	,
35	,
34	,
33	,
32	,
42	,
41	,
40	,
39	,
46	,
45	,
44	,
43	,

};

#define RANGE 200

void calcInThread(void * arg) {
	int mark[46][2], order[46], result[4];
	int a,b,c,d,i,j,max,temp[2];
	for (a = (int)arg, max = a+10; a < max; a++) {
		for (b = 1; b <= RANGE; b++) {
			for (c = 1; c <= RANGE; c++) {
				for (d = 1; d <= RANGE; d++) {
					result[0] = a;
					result[1] = b;
					result[2] = c;
					result[3] = d;

					for (i = 0; i < 46; i++) {
						mark[i][0] = 0;
						mark[i][1] = i;
						for (j = 0; j < 4; j++) {
							mark[i][0] += typeCounts[i][j] * result[j];
						}
					}
					for (i = 0; i < 46; i++) {
						for (j = i + 1; j < 46; j++) {
							if (mark[j][0] > mark[i][0]) {
								temp[0] = mark[j][0];
								temp[1] = mark[j][1];
								mark[j][0] = mark[i][0];
								mark[j][1] = mark[j][1];
								mark[i][0] = temp[0];
								mark[i][1] = temp[1];
							}
						}
					}
					for (i = 0; i < 46; i++) {
						order[mark[i][1]] = i + 1;
					}
					for (i = 0; i < 46; i++) {
						if (order[i] != targetOrder[i]) {
							break;
						}
					}
					if (i == 46) {
						printf("%d,%d,%d,%d:found\n", a, b, c, d);
						exit(0);
					}
				}
			}
		}
		printf("%d:no match\n", a);
	}
}

int main(int argc, char const *argv[])
{
	pthread_t id;
	int i = 0;
	for (; i < RANGE; i+=10) {
		pthread_create(&id, NULL, (void*) calcInThread, (void*) i);
	}
	sleep(0xFFFFFFFFL);
	return 0;
}

// gcc -o calc -pthread calc.c
